package ecom.ejb;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import ecom.entity.AccountRemote;
import ecom.entity.Account;
import ecom.entity.ProductStoreRemote;
import ecom.entity.ProductStore;
import ecom.entity.ProductRemote;
import ecom.entity.Product;
import exceptions.IdentifiantInvalide;
import exceptions.InstanceInvalide;

/**
 * 
 * @author Francois Haurit
 * @version 1.0
 */

public abstract class CommonBean implements CommonRemote {
    /**
     * EntityManager.
     */
    @PersistenceContext
    EntityManager em;


    @Override
    public String sayHello() {
	return "Bienvenue sur eCom";
    }

    @Override
    public AccountRemote getAccount(String iban) throws IdentifiantInvalide {
	AccountRemote retour = null;

	Account.verifierIban(iban);
	retour = em.find(Account.class, iban);
	if (retour != null) {
	    em.refresh(retour);
	}

	return retour;
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<AccountRemote> listAccounts() {
	List<AccountRemote> retour = null;

	retour = em.createNamedQuery("Account.getAll").getResultList();

	return retour;
    }

    @Override
    public ProductStoreRemote getProductStore(Long reference) throws IdentifiantInvalide {
	/*
	 * Variable de retour
	 */
	ProductStoreRemote retour = null;

	/*
	 * Vérification de l'identifiant
	 */
	ProductStore.verifierReference(reference);

	/*
	 * Récupération de l'instance
	 */
	retour = em.find(ProductStore.class, reference);

	/*
	 * Rafraichissement si présent
	 */
	if (retour != null) {
	    em.refresh(retour);
	}

	/*
	 * Sortie
	 */
	return retour;
    }

    @Override
    public void updateAccount(AccountRemote account) throws IdentifiantInvalide,
	    InstanceInvalide {
	/*
	 * Vérification de l'instance
	 */
	Account.verifierInstance(account);

	/*
	 * Récupération de l'instance que l'on va modifier
	 */
	AccountRemote AccountPersistence = this.getAccount(account.getIban());

	/*
	 * Modification de la valorisation si présent
	 */
	if (AccountPersistence != null) {
	    AccountPersistence.setSolde(account.getSolde());
	} else {
	    throw new IdentifiantInvalide("L'iban du Account est introuvable : "
		    + account.getIban());
	}
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<ProductStoreRemote> listProductStores() {
	/*
	 * Variable de retour
	 */
	List<ProductStoreRemote> retour = null;

	/*
	 * Exécution de la reqûete
	 */
	retour = em.createNamedQuery("ProductStore.getAll").getResultList();

	/*
	 * Sortie
	 */
	return retour;
    }

    @Override
    public ProductRemote getProduct(Long reference) throws IdentifiantInvalide {
	ProductRemote retour = null;

	Product.verifierReference(reference);
	retour = em.find(Product.class, reference);
	if (retour != null) {
	    em.refresh(retour);
	}

	return retour;
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<ProductRemote> listProducts() {
	/*
	 * Variable de retour
	 */
	List<ProductRemote> retour = null;

	/*
	 * Exécution de la reqûete
	 */
	retour = em.createNamedQuery("Product.getAll").getResultList();

	/*
	 * Sortie
	 */
	return retour;
    }
}
